home *** CD-ROM | disk | FTP | other *** search
/ Alles Voor Internet / Tout Pour Internet / alles voor internet.iso / MacInternet™ / Telnet / NCSA / tn3270 2.3d26 source / tn3270 / tcpio.c < prev    next >
C/C++ Source or Header  |  1991-05-29  |  37KB  |  1,603 lines

  1. /*
  2.  *  tn3270 for the Macintosh Source Code
  3.  *  Brown University Computing and Information Services
  4.  *  Version 2.3d21, January 17, 1991
  5.  *  Copyright (c) 1988, 1989, 1990, 1991 by Brown University and by
  6.  *  Peter John DiCamillo.
  7.  *
  8.  *  Permission is granted to any individual or institution to use, copy,
  9.  *  or redistribute the binary version of this software and its
  10.  *  documentation provided this notice and the copyright notices are
  11.  *  retained.  Permission is granted to any individual or non-profit
  12.  *  institution to use, copy, modify, or redistribute the source files
  13.  *  of this software provided this notice and the copyright notices are
  14.  *  retained.  This software may not be distributed for profit, either
  15.  *  in original form or in derivative works, nor can the source be
  16.  *  distributed to other than an individual or a non-profit institution.
  17.  *  Any  individual or group interested in seeing and/or using these
  18.  *  source files but who are prevented from doing so by the above
  19.  *  constraints should contact Don Wolfe, Assistant Vice-President for
  20.  *  Computer Systems at Brown University, (401) 863-7250, for possible
  21.  *  software licensing of the source developed at Brown.
  22.  *
  23.  *  Brown University and Peter John DiCamillo make no representations
  24.  *  about the suitability of this software for any purpose.
  25.  *
  26.  *  BROWN UNIVERSITY AND PETER JOHN DICAMILLO GIVE NO WARRANTY, EITHER
  27.  *  EXPRESS OR IMPLIED, FOR THE PROGRAM AND/OR DOCUMENTATION PROVIDED,
  28.  *  INCLUDING, WITHOUT LIMITATION, WARRANTY OF MERCHANTABILITY AND
  29.  *  WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE.
  30.  *
  31.  */
  32.  
  33. #define __SEG__ 3270tcp
  34. #include "maclib.h"
  35. #include "AppleTalk.h"
  36. #include "termdef.h"
  37. #include "globals.h"
  38. #include "kip.h"
  39. #include "netevent.h"
  40. #include "hostform.h"
  41.  
  42. #define CFIGFILE    "NCSA Telnet Settings"
  43. #define HTELNET    23
  44.  
  45. unsigned char myipnum[4];    /* my IP number */
  46. long kipns;                    /* name server from KIP */
  47. long mynetmask;                /* my network mask */
  48. unsigned char KIPserver[4];    /* AppleTalk address of KIP gateway */
  49. int KIP;                    /* KIP gateway is present */
  50. int HFS;                    /* HFS file system being used */
  51. extern int EtherNet;        /* "The all-powerful! */
  52. #ifdef TCPDRV
  53. static char KIPzone[33] = "\p*";    /* just to keep the linker happy */
  54. static char *KIPnameptr;
  55. #else
  56. extern char KIPzone[33];    /* zone for KIP from config file */
  57. extern char *KIPnameptr;    /* NamesTableEntry pointer for KIP */
  58. #endif
  59.  
  60. char unldATP;                /* flag to unload .ATP driver */
  61. char unldNBP;                /* flag to unload NBP */
  62. char dynam;                    /* myipnum was obtained dynamically */
  63. char snetmask;                /* mask was obtained from file */
  64. char kipreg;                /* flag to unregister address */
  65. NamesTableEntry myreg;        /* my registration entry */
  66. int myport;                    /* port to close from netopen */
  67. struct machinfo * mp;        /* info for machine we connect to */
  68. short savedvol;                /* saved volref to restore after configuration */
  69. extern short launchvol;        /* default volume when we were launched */
  70.  
  71. extern int button;            /* true if mouse down at startup */
  72. extern char tcpinitok;        /* network code is active */
  73. extern char pend_conn;        /* connection pending status */
  74. extern char data_init;        /* flag for stream parsing */
  75. extern short askedSGA;        /* flag for SGA negotiation */
  76. extern char hisopts[];        /* option flags */
  77. extern char myopts[];
  78. extern short telrcv_state;    /* FSA state */
  79. extern char sent3270tt;
  80. extern char hadascii;
  81. extern char newserver;        /* server supports new protocol */
  82. extern char vmxbgn;            /* xfer mode active flag */
  83. extern char vmxsub;            /* xfer subset mode active flag */
  84. extern char skiplf;            /* lf flag for serscrn */
  85. extern char escmode;        /* ESC mode for serscrn */
  86. extern char ftpavail;        /* flag for FTP enabled */
  87. extern char tcpinv;            /* tcp pending invldscr */
  88. extern short systemvol;        /* volume with system files */
  89. extern char sessionhost[];    /* saved name of host we connect to */
  90. extern struct Point sfgpoint;    /* SFGetFile location */
  91. extern main();                /* for debugging */
  92.  
  93.                             /* for debugging via serial port */
  94. static IOParam pbo;                /* serial output parms */
  95. static unsigned char pbchr;        /* output character */
  96.  
  97. unsigned char * wsfbuff;    /* buffer for accumulating wsf data */
  98. unsigned char tcphostname[128];        /* cshostname, or prompt response */
  99. extern char serverconn, servermode, serverflags;    /* for non-terminal server */
  100. #include "stdio.h"
  101.  
  102. static unsigned char tcpmsg[256];
  103. static char tcpopnflg = 0;
  104. unsigned char * rcvbuff;
  105. short rcvmax;
  106. short rdportnum();
  107.  
  108. OSErr NBld();
  109. OSErr nblookup();
  110. OSErr atsend();
  111. OSErr kpdynamip();
  112. OSErr kpregister();
  113. OSErr openatdrv();
  114. OSErr getstr();
  115.  
  116. tcp_init()
  117. {
  118. long *HFSp= (long *)1014;
  119. char rarp;
  120. Handle version;
  121. short i;
  122.                                         /* version info. for debugging */
  123. strcpy(tcpmsg, "Version string: ");
  124. version = GetResource('GFTM', 0);
  125. if (version != 0) {
  126.     i = strlen(tcpmsg);
  127.     movmem((*version)+1, tcpmsg+i, (*version)[0]);
  128.     tcpmsg[i+(*version)[0]] = 0;
  129.     }
  130. else strcpy(tcpmsg, "Version string not available.");
  131. putln(tcpmsg);
  132. strcpy(tcpmsg, "VM file transfer version: ");
  133. version = GetResource('WSFR', 161);
  134. if (version != 0) {
  135.     i = strlen(tcpmsg);
  136.     movmem((*version)+13, tcpmsg+i, (*version)[12]-1);
  137.     tcpmsg[i+(*version)[12]-1] = 0;
  138.     while (tcpmsg[i] != 0) {
  139.         tcpmsg[i] = ((unsigned char *)(*xtabh))[tcpmsg[i]];
  140.         i++;
  141.         }
  142.     }
  143. else strcpy(tcpmsg, "VM file transfer version unknown.");
  144. putln(tcpmsg);
  145. sprintf(tcpmsg, "main at %lx", main);    /* in case we're using a map */
  146. putln(tcpmsg);                            /* for debugging */
  147.  
  148. dfltsflg = 2;        /* default connection is TCP/IP */
  149. KIP = 0;            /* no KIP gateway yet */
  150. HFS = (*HFSp) > 0L;    /* check if under HFS */
  151. unldATP = 0;        /* haven't loaded ATP */
  152. unldNBP = 0;        /* haven't loaded NBP */
  153. kipreg = 0;            /* haven't registered our address */
  154. kipns = 0;            /* no nameserver from KIP */
  155. tcpinv = 0;            /* no pending invldscr call */
  156. pndbeep = 0;        /* no pending beep call */
  157.  
  158. /* allocate buffers */
  159. rcvbuff = (unsigned char *)NewPtr(614L);    /* 550 + 64 */
  160. if (rcvbuff == 0L) {
  161.     stgalert("tcp rcv buffer", "NewPtr", 614L);
  162.     macend();
  163.     ExitToShell();
  164.     }
  165. rcvmax = 512;
  166.  
  167. wsfbuff = (unsigned char *)NewPtr(8192L);
  168. if (wsfbuff == 0L) {
  169.     stgalert("tcp wsf buffer", "NewPtr", 8192L);
  170.     macend();
  171.     ExitToShell();
  172.     }
  173.  
  174. /* change name in Apple menu */
  175. SetItem(myMenus[0], 1, "About tn3270...");
  176. /* change names in File menu */
  177. SetItem(myMenus[1], 1, "Open Connection");
  178. SetItem(myMenus[1], 2, "Close Connection");
  179.  
  180. /* disable function key menu */
  181. DisableItem(myMenus[4], 0);
  182.  
  183. /* add Network menu */
  184. InsertMenu(myMenus[5], 0);
  185. DrawMenuBar();
  186.  
  187. /* save current volume, and attempt to find config.tel */
  188. GetVol(tcpmsg, &savedvol);
  189. checkhostfile();
  190.  
  191. /* initialize and get host information */
  192. ioerror = Snetinit();        /* calls initipnum() */
  193. sprintf(tcpmsg, "return code %d from Snetinit", ioerror);
  194. putln(tcpmsg);
  195. SetVol(0L, savedvol);    /* restore initial volume */
  196. if ((ioerror != 0) && (ioerror != -2)) {
  197.     ShowAllErrors();
  198.     DisposPtr(wsfbuff);
  199.     DisposPtr(rcvbuff);
  200.     return;
  201.     }
  202. tcpinitok = 1;                    /* remember to shutdown net stuff */
  203. /* if (ioerror == -2) ioerror = reconfigNetwork(); */    /* RARP failed */
  204. if (ioerror != 0) {
  205.     ShowAllErrors();
  206.     netshut();
  207.     tcpinitok = 0;
  208.     DisposPtr(wsfbuff);
  209.     DisposPtr(rcvbuff);
  210.     return;
  211.     }
  212.     
  213. if (EtherNet) 
  214.     dynam = (myipnum[0] == 'R') && (myipnum[1] == 'A') &&
  215.             (myipnum[2] == 'R') && (myipnum[3] == 'P');
  216. netgetip(myipnum);                /* get net number, in case RARPed */
  217. netgetmask(&mynetmask);            /* mask may have changed too */
  218. ftpavail = Sfmode();            /* get initial FTP settings */
  219. }
  220.  
  221. int initipnum(dummy)
  222. int dummy;        /* used to be "button" */
  223. {
  224. NTElement lkpresult;
  225. BDSType retBDS;
  226. IPGP gateSend, gateRec;
  227. short count, rc;
  228. unsigned char nsaddr[4];
  229.  
  230. /* open AppleTalk drivers if not using Ethernet */
  231.  
  232. if (!EtherNet) {
  233.     ioerror = openatdrv();
  234.     if (ioerror != 0) quit();
  235.  
  236.     /* check for KIP gateway, and if found load number from it */
  237.     ioerror = NBld();                /* attempt to load NBP */
  238.     if (ioerror != 0) {
  239.         stoperr(loadalrt);
  240.         quit();
  241.         }
  242.                                     /*  look for gateway */
  243.     rc = nblookup("\p=", "\pIPGATEWAY", KIPzone, &lkpresult, &count);
  244.     sprintf(tcpmsg, "rc = %d, count = %d looking for =:IPGATEWAY@%p",
  245.             rc, count, KIPzone);
  246.     putln(tcpmsg);
  247.     if ((rc == 0) && (count > 0)) {
  248.         KIP = 1;
  249.         movmem(&lkpresult.nteAddress, KIPserver, 4);    /* get gateway addr. */
  250.         retBDS[0].buffSize = sizeof(gateRec);        /* get nameserver address */
  251.         retBDS[0].buffPtr = (Ptr)&gateRec;
  252.         gateSend.opcode = 3;
  253.         rc = atsend(KIPserver, &gateSend, sizeof(struct IPGP), retBDS);
  254.         if (rc == 0) {                    /* got an address */
  255.             kipns = gateRec.ipname;
  256.             if (kipns != 0) {
  257.                 Ssetns(&kipns);
  258.                 movmem(&kipns, nsaddr, 4);
  259.                 sprintf(tcpmsg, 
  260.                     "Using name server address from gateway: %d.%d.%d.%d",
  261.                     nsaddr[0], nsaddr[1], nsaddr[2], nsaddr[3]);
  262.                 putln(tcpmsg);
  263.                 }
  264.             else {
  265.                 sprintf(tcpmsg, 
  266.                     "Name server address not available from gateway.");
  267.                 putln(tcpmsg);
  268.                 }
  269.             }
  270.         else {
  271.             sprintf(tcpmsg, "Return code %d getting nameserver address", rc);
  272.             putln(tcpmsg);
  273.             }
  274.         }
  275.     }
  276. else KIP = 0;
  277.  
  278. ioerror = getipinfo();            /* try to get IP number and mask */
  279. if (button || (ioerror != 0)) {
  280.     ioerror = promptip(0);            /* get info from user */
  281.     if (ioerror != 0) stoperr(cfigalrt);    /* report error saving config */
  282.     ioerror = getipinfo();            /* try again */
  283.     if (ioerror != 0) {             /* exit with error if still failed */
  284.         stoperr(addralrt);
  285.         quit();
  286.         }
  287.     }
  288.  
  289. if (KIP) {                        /* for KIP, need to register number */
  290.     ioerror = kpregister(myipnum);    
  291.     if (ioerror != 0) {         /* exit with error if failed */
  292.         stoperr(regalrt);
  293.         quit();
  294.         }
  295.     else kipreg = 1;
  296.     }
  297.  
  298. netsetip(myipnum);                /* set IP number */
  299. netsetmask(&mynetmask);            /* set network mask */
  300. putln("initipnum done");
  301. return(0);
  302. }
  303.  
  304. getipinfo()                    /* get IP number and mask */
  305. {
  306. short error, rc;
  307. char strbuf[256];
  308. long dfltmask;
  309. short dfltvol;
  310.  
  311. mynetmask = 0;                /* initialize mask */
  312. dynam = 0;                    /* no dynamic number yet */
  313. snetmask = 0;                /* no mask from file */
  314.                             /* get IP number */
  315. error = getstr(strbuf, 256, 256);
  316. if (error == 0) error = decodeIPnum(strbuf, myipnum);
  317. if (error) putln("no IP number from resource");
  318. else putln("got IP number from resource");
  319.  
  320. if (error) {
  321.     if (EtherNet) {                /* dynamic if Ether and no IP number */
  322.         strncpy(myipnum, "RARP", 4);
  323.         dynam = 1;
  324.         error = 0;
  325.         putln("using RARP");
  326.         }
  327.     else if (KIP) {                /* dynamic if KIP and no IP number */
  328.         error = kpdynamip(myipnum);
  329.         if (!error) {
  330.             dynam = 1;
  331.             putln("got dynamic IP number");
  332.             }
  333.         }
  334.     }
  335.                             /* get subnet mask */
  336. if (!error) {
  337.     rc = getstr(strbuf, 256, 258);
  338.     if (rc == 0) {
  339.         if (sscanf(strbuf, "%lx", &mynetmask) != 1)
  340.             calcmask(&mynetmask);
  341.         else {
  342.             calcmask(&dfltmask);
  343.             snetmask = (mynetmask != dfltmask);
  344.             }
  345.         }
  346.     else calcmask(&mynetmask);
  347.     sprintf(tcpmsg, "net mask = %08lx", mynetmask);
  348.     putln(tcpmsg);
  349.     }
  350.  
  351. if (error) {
  352.     setmem(myipnum, 4, 0);    /* ipnum = 0 if errors */
  353.     mynetmask = 0;            /* mask too */
  354.     putln("error from getipinfo");
  355.     }
  356. return(error);
  357. }
  358.  
  359. promptip(ro)
  360. short ro;
  361. {
  362.  
  363. DialogPtr dlgptr;
  364. DialogPeek dStorage;
  365. WindowPtr behind;
  366. pascal unsigned short DlgFilter();
  367. unsigned short (*filterProc) ();
  368. short oldHit, itemHit;
  369. short gtype;
  370. Handle iphandle, dynamhandle, maskhandle;
  371. Rect gbox;
  372. unsigned char ipstr[30], maskstr[20], change;
  373. unsigned char tempnum[20];
  374. OSErr rc;
  375. long dfltmask;
  376. short i, rfile;
  377. int hi, low, node;
  378. Size ressize;
  379. Handle temph;
  380. char rarp;
  381.  
  382. #ifdef TCPDRV
  383. if (ro) showdrv();
  384. return;
  385. #endif
  386.  
  387. dStorage = 0;
  388. behind = (WindowPtr)-1;        /* 272 = r/w, 273 = r/o */
  389. dlgptr = GetNewDialog(272+ro, dStorage, behind);
  390. ctrwindow(dlgptr);
  391.  
  392. /* get handles to various items */
  393. GetDItem(dlgptr, 3, >ype, &iphandle, &gbox);
  394. GetDItem(dlgptr, 4, >ype, &dynamhandle, &gbox);
  395. GetDItem(dlgptr, 7, >ype, &maskhandle, &gbox);
  396.  
  397. /* get initial settings */
  398.             /* disable dynamic address if AppleTalk and no KIP */
  399. if (!EtherNet && !KIP) HiliteControl(dynamhandle, 255);
  400.             /* set ip number radio buttons */
  401. if (!ro) setit(2, dlgptr, (!dynam));
  402. setit(4, dlgptr, dynam && (KIP || EtherNet));
  403.             /* set current ip number */
  404. rc = 4;
  405. if (!ro) rc = getstr(ipstr, 30, 256);
  406. if (rc != 0) {
  407.     rarp = (myipnum[0] == 'R') && (myipnum[1] == 'A') &&
  408.            (myipnum[2] == 'R') && (myipnum[3] == 'P');
  409.     if (!rarp) sprintf(ipstr, "%d.%d.%d.%d", myipnum[0], myipnum[1],
  410.                                              myipnum[2], myipnum[3]);
  411.     else strcpy(ipstr, "0.0.0.0");
  412.     }
  413. SetIText(iphandle, ipstr);
  414.             /* set current ip mask */
  415. cvtmask(mynetmask, maskstr);
  416. SetIText(maskhandle, maskstr);
  417.             /* set "use subnetting" check box */
  418. setit(5, dlgptr, snetmask);
  419.             /* for info. display, get AppleTalk numbers */
  420. if (ro) {
  421.     if (EtherNet) hi = low = node = 0;
  422.     else getATaddress( &hi, &low, &node);
  423.     sprintf(tempnum, "%d.%d", hi, low);
  424.     GetDItem(dlgptr, 10, >ype, &temph, &gbox);
  425.     SetIText(temph, tempnum);
  426.     sprintf(tempnum, "%d", node);
  427.     GetDItem(dlgptr, 12, >ype, &temph, &gbox);
  428.     SetIText(temph, tempnum);
  429.     GetDItem(dlgptr, 13, >ype, &temph, &gbox);
  430.     if (EtherNet) SetIText(temph, "[RARP]");
  431.     else if (KIP) SetIText(temph, "[KIP]");
  432.     }
  433. else {
  434.     GetDItem(dlgptr, 9, >ype, &temph, &gbox);
  435.     if (EtherNet) SetIText(temph, "[RARP]");
  436.     else if (KIP) SetIText(temph, "[KIP]");
  437.     }
  438.  
  439. /* ready to display the dialog */
  440. ShowWindow(dlgptr);
  441. arrowcursor();
  442. /* frame the default selection */
  443. framedflt(dlgptr);
  444.  
  445. filterProc = DlgFilter;
  446. oldHit = 0;
  447. change = 0;
  448. while(1) {
  449.     ModalDialog(filterProc, &itemHit);
  450.     if (itemHit != 1) change = 1;
  451.     if ((oldHit > 0) && (oldHit != itemHit))
  452.     switch(oldHit) {
  453.         case 3:                /* IP number editText */
  454.             GetIText(iphandle, ipstr);
  455.             rc = decodeIPnum(ipstr, tempnum);
  456.             if (rc) SetIText(iphandle, "0.0.0.0");
  457.             break;
  458.         case 7:                /* mask editText */
  459.             GetIText(maskhandle, maskstr);
  460.             if (sscanf(maskstr, "%lx", &mynetmask) != 1)
  461.                 calcmask(&mynetmask);
  462.             cvtmask(mynetmask, maskstr);
  463.             SetIText(maskhandle, maskstr);
  464.             break;
  465.         default:
  466.             break;
  467.         }
  468.     oldHit = itemHit;
  469.     switch(itemHit) {
  470.         case 2:                    /* IP number buttons */
  471.         case 4:
  472.             dynam = (itemHit == 4);
  473.             setit(2, dlgptr, (!dynam));
  474.             setit(4, dlgptr, dynam);
  475.             break;
  476.         case 5:                    /* use subnetting box */
  477.             snetmask ^= 1;
  478.             setit(5, dlgptr, snetmask);
  479.             break;
  480.         }
  481.     if (itemHit == 1) break;
  482.     }
  483.  
  484. /* just return if only "OK" was hit or r/o */
  485. if ((!change) || ro) {
  486.     DisposDialog(dlgptr);
  487.     return(0);
  488.     }
  489.  
  490. /* set ipstr and maskstr to the text to save */
  491.         /* use number unless dynamic specified */
  492. if (dynam) ipstr[0] = 0;
  493. else GetIText(iphandle, ipstr);
  494.         /* use mask if subnetting requested */
  495. if (snetmask) GetIText(maskhandle, maskstr);
  496. else maskstr[0] = 0;
  497.  
  498. /* done with dialog now */
  499. DisposDialog(dlgptr);
  500.  
  501. /* delete any existing number and mask resources */
  502. sysvol(0);
  503. rfile = OpenResFile(CFIGFILE);
  504. if (rfile != -1) {
  505.     temph = GetResource('STR ', 256);
  506.     if (temph != 0) if (HomeResFile(temph) == rfile) {
  507.         RmveResource(temph);
  508.         }
  509.     temph = GetResource('STR ', 258);
  510.     if (temph != 0) if (HomeResFile(temph) == rfile) {
  511.         RmveResource(temph);
  512.         }
  513.     CloseResFile(rfile);
  514.     }
  515. else {
  516.     Create(CFIGFILE, 0, 'NCSA', 'IPNO');
  517.     CreateResFile(CFIGFILE);
  518.     }
  519.  
  520. /* return if not storing number and mask */
  521. if ((ipstr[0] == 0) && (maskstr[0] == 0)) {
  522.     sysvol(1);
  523.     return(0);
  524.     }
  525.  
  526. /* get handles to strings to write out */
  527. if (ipstr[0] != 0) {
  528.     ctop(ipstr);
  529.     ressize = ipstr[0] + 1;
  530.     iphandle = NewHandle(ressize);
  531.     if (iphandle == 0) {
  532.         sysvol(1);
  533.         return(1);
  534.         }
  535.     movmem(ipstr, (*iphandle), ipstr[0]+1);
  536.     }
  537. else iphandle = 0;
  538.  
  539. if (maskstr[0] != 0) {
  540.     ctop(maskstr);
  541.     ressize = maskstr[0] + 1;
  542.     maskhandle = NewHandle(ressize);
  543.     if (maskhandle == 0) {
  544.         if (iphandle != 0) DisposHandle(iphandle);
  545.         sysvol(1);
  546.         return(2);
  547.         }
  548.     movmem(maskstr, (*maskhandle), maskstr[0]+1);
  549.     }
  550. else maskhandle = 0;
  551.  
  552.  
  553. /* write the required resources */
  554. rfile = OpenResFile(CFIGFILE);
  555. if ((ResError() == 0) && (iphandle != 0)) 
  556.     AddResource(iphandle, 'STR ', 256, "IP Number");
  557. if ((ResError() == 0) && (maskhandle != 0))
  558.     AddResource(maskhandle, 'STR ', 258, "Network Mask");
  559. rc = ResError();
  560. if (rfile != -1) CloseResFile(rfile);
  561. if (rc == 0) rc = ResError();
  562. sysvol(1);
  563. return(rc);
  564. }
  565.  
  566. updhostrsc(s)                /* store new default host name */
  567. char * s;
  568. {
  569. short rfile;
  570. Handle temph;
  571. Size ressize;
  572.  
  573. /* delete any existing host resource */
  574. sysvol(0);
  575. rfile = OpenResFile(CFIGFILE);
  576. if (rfile != -1) {
  577.     temph = GetResource('STR ', 257);
  578.     if (temph != 0) if (HomeResFile(temph) == rfile) {
  579.         RmveResource(temph);
  580.         }
  581.     CloseResFile(rfile);
  582.     }
  583. else {
  584.     Create(CFIGFILE, 0, 'NCSA', 'IPNO');
  585.     CreateResFile(CFIGFILE);
  586.     }
  587.  
  588. /* return if not storing host name */
  589. if (s[0] == 0) {
  590.     sysvol(1);
  591.     return;
  592.     }
  593.  
  594. /* get handles to string to write out */
  595. ctop(s);
  596. ressize = s[0] + 1;
  597. temph = NewHandle(ressize);
  598. if (temph == 0) {
  599.     sysvol(1);
  600.     return;
  601.     }
  602. movmem(s, (*temph), s[0]+1);
  603.  
  604. /* write the required resource */
  605. rfile = OpenResFile(CFIGFILE);
  606. if ((ResError() == 0) && (temph != 0)) 
  607.     AddResource(temph, 'STR ', 257, "Default Host");
  608. if (rfile != -1) CloseResFile(rfile);
  609. sysvol(1);
  610. return;
  611. }
  612.  
  613. showdrv()
  614. {
  615. DialogPtr dlgptr;
  616. DialogPeek dStorage;
  617. WindowPtr behind;
  618. pascal unsigned short DlgFilter();
  619. unsigned short (*filterProc) ();
  620. short itemHit;
  621. short gtype;
  622. Handle iphandle;
  623. Rect gbox;
  624. unsigned char ipstr[30];
  625.  
  626. dStorage = 0;
  627. behind = (WindowPtr)-1;    
  628. dlgptr = GetNewDialog(280, dStorage, behind);
  629. ctrwindow(dlgptr);
  630.  
  631. GetDItem(dlgptr, 4, >ype, &iphandle, &gbox);
  632. sprintf(ipstr, "%d.%d.%d.%d", myipnum[0], myipnum[1],
  633.                              myipnum[2], myipnum[3]);
  634. SetIText(iphandle, ipstr);
  635.  
  636. /* ready to display the dialog */
  637. ShowWindow(dlgptr);
  638. arrowcursor();
  639. /* frame the default selection */
  640. framedflt(dlgptr);
  641.  
  642. /* show dialog */
  643. filterProc = DlgFilter;
  644. ModalDialog(filterProc, &itemHit);
  645. DisposDialog(dlgptr);
  646. return(0);
  647. }
  648.  
  649. calcmask(mask)                /* calculate mask from IP number */
  650. long * mask;
  651. {
  652. if (!(myipnum[0] & 0x80))
  653.         (*mask) = 0xff000000;            /* Class A */
  654.     else if ((myipnum[0] & 0xc0) == 0x80)
  655.         (*mask) = 0xffff0000;            /* Class B */
  656.     else
  657.         (*mask) = 0xffffff00;            /* Class C */
  658. }
  659.  
  660. tcpdflthost(s)
  661. char * s;
  662. {
  663. short rc;
  664.  
  665. rc = getstr(s, 128, 257);
  666. if (rc != 0) strcpy(s, "?");    /* If "?", prompt will be issued */
  667. }
  668.  
  669. long tcpgetrsrv(init)
  670. char init;
  671. {
  672. #ifdef TCPDRV
  673. if (init) return(131072);
  674. else {
  675.     if (online) return(20480);
  676.     else return(40960);
  677.     }
  678. #else
  679. if (init) return(135168);
  680. else {
  681.     return(26624);
  682.     }
  683. #endif
  684. }
  685.  
  686. tcplgin()
  687. {
  688. struct machinfo *Sgethost();
  689. short i;
  690. OSErr rc, hostdlg();
  691.  
  692. /* attempt to get host name or address for this session */
  693. if (apiopen && (apihostname[0] != 0)) {
  694.     strcpy(tcphostname, apihostname);
  695.     }
  696. else {
  697.     strcpy(tcphostname, cshostname);
  698.     }
  699. if (strcmp(tcphostname, "?") == 0) {
  700.     strcpy(tcphostname, "");    /* initial value for hostdlg */
  701.     rc = hostdlg(tcphostname);
  702.     if (rc != noErr) return;
  703.     }
  704. strcpy(sessionhost, tcphostname);    /* host name for this session */
  705. for (i=0; i < 128; i++) {
  706.     if (sessionhost[i] == '\0') break;
  707.     if (sessionhost[i] == ':') {
  708.         sessionhost[i] = '\0';
  709.         break;
  710.         }
  711.     }
  712.  
  713. xfrst();            /* reset file transfer status */
  714. rbsize = 0;
  715. kblock = 1;            /* initialize status line variables */
  716. kblcode = 2;
  717. ioerror = 0;
  718. data_init = 1;        /* first data byte will begin write */
  719. askedSGA = 0;        /* haven't negotiated SGA yet */
  720. setmem(hisopts, 256, 0);    /* initialize option flags */
  721. setmem(myopts, 256, 0);
  722. telrcv_state = 0;    /* initialize FSA */
  723. sent3270tt = 0;        /* haven't sent 3270 terminal type */
  724. hadascii = 0;        /* no ascii data yet */
  725. newserver = 0;        /* assume not new server */
  726. skiplf = 0;            /* reset line mode flags */
  727. escmode = 0;
  728.  
  729.     /* attempt to get IP address for host */
  730. mp = Sgethost(sessionhost);
  731. ShowAllErrors();
  732. if (!mp) {            /* table lookup failed; try name server */
  733.     myport = Sdomain(sessionhost);
  734.     sprintf(tcpmsg, "return code %d from Sdomain for %s",
  735.         myport, sessionhost);
  736.     putln(tcpmsg);
  737.     if (myport == -1) {
  738.         stoperr(domalrt);
  739.         kblcode = 4;
  740.         if (apiopen) {
  741.             apiopenerr(openResFailed);
  742.             }
  743.         }
  744.     else pend_conn = 1;
  745.     }
  746. else {                /* try to open a connection */
  747.     myport = Snetopen(mp, rdportnum());
  748.     if (myport < 0) {
  749.         stoperr(topnalrt);
  750.         kblcode = 4;
  751.         if (apiopen) {
  752.             apiopenerr(openConnFailed);
  753.             }
  754.         }
  755.     else pend_conn = 2;
  756.     }
  757. }
  758.  
  759. tcplgout()
  760. {
  761. if (apiopenpend) apiopenerr(openConnFailed);
  762. apiopen = 0;
  763. if ((pend_conn > 0) || (logon)) netclose(myport);
  764. ftpcopen = ftpdopen = ftplopen = 0;        /* no TCP/IP FTP yet */
  765. pend_conn = 0;
  766. online = logon = 0;
  767. kbqsize = 0;
  768. kblock = 1;
  769. if (kblcode != 3) kblcode = 4;
  770. if (myWindow != 0) {
  771.     closeresponse(closeUnknown);
  772.     newstat();
  773.     removewindow();
  774.     apideregister(1);    /* deregister session */
  775.     }
  776. DisableItem(myMenus[4], 0);
  777. DrawMenuBar();
  778. }
  779.  
  780. tcp_end()
  781. {
  782. if (apiopenpend) apiopenerr(openConnFailed);
  783. apiopen = 0;
  784. if ((pend_conn > 0) || (logon)) {
  785.     netclose(myport);
  786.     pend_conn = 0;
  787.     logon = 0;
  788.     }
  789. if (kipreg) {
  790.     kpunregister();        /* un-register our address */
  791.     kipreg = 0;
  792.     }
  793. if (tcpinitok) {
  794.     netshut();            /* undo Snetinit */
  795.     tcpinitok = 0;
  796.     }
  797. NBuld();            /* unload NBP */
  798. ATuld();            /* unload ATP */
  799. DisposPtr(wsfbuff);
  800. DisposPtr(rcvbuff);
  801. }
  802.  
  803. /* tcpwrite - call netwrite to get all data written */
  804. tcpwrite(dptr, dsize)
  805. unsigned char * dptr;
  806. short dsize;
  807. {
  808. short cnt;
  809. static unsigned long * Ticks = (unsigned long *)0x16a;
  810. unsigned long limit;
  811.  
  812. online = 0;
  813. newstat();
  814. limit = (*Ticks) + 60 * cs.timeout * cs.retries;
  815. while (dsize > 0) {
  816.     if (cs.dblevel > 2) tcpdump("netwrite", dptr, dsize);
  817.     netpush(myport);
  818.     cnt = netwrite(myport, dptr, dsize);
  819.     if (cs.dblevel > 2) {
  820.         sprintf(tcpmsg, "netwrite wrote %d bytes", cnt);
  821.         putln(tcpmsg);
  822.         }
  823.     if (cnt > 0) {
  824.         dptr += cnt;
  825.         dsize -= cnt;
  826.         limit = (*Ticks) + 60 * cs.timeout * cs.retries;
  827.         }
  828.     myStask();
  829.     if ((*Ticks) > limit) {
  830.         kblcode = 3;
  831.         ioerror = 4;
  832.         closeresponse(closeNetFail);
  833.         tcplgout();
  834.         stoperr(wrtalrt);
  835.         return;
  836.         }
  837.     }
  838. online = 1;
  839. newstat();
  840. }
  841.  
  842. tcpin(asc, chr, shift)
  843. unsigned char asc, chr, shift;
  844. {
  845.  
  846. if (!logon) {                /* Return or CLEAR for new session, else beep */
  847.     if (pend_conn == 0) kbnew(chr, shift);
  848.     else if ((pend_conn == 3) && (!kblock)) tcpkbin(asc, chr, shift);
  849.     else beep();
  850.     return;
  851.     }
  852.  
  853. if (chr == 196) {            /* perform program reset immediately */
  854.     tcp_reset();
  855.     xfrst();
  856.     invldscr();
  857.     return;
  858.     }
  859.  
  860. if (chr == 185) {            /* perform keyboard immediately */
  861.     hndkbd(chr, shift);
  862.     return;
  863.     }
  864.  
  865. if ((kbqsize == KBQMAX) || (vmxbgn && (!vmxsub))) {
  866.     beep();            /* error if xfer mode or queue full */
  867.     kerr(3);
  868.     }
  869. else {                        /* else add to keyboard queue */
  870.     kbqueue[kbqsize].code = chr;
  871.     kbqueue[kbqsize].shift = shift;
  872.     kbqsize++;
  873.     }
  874. }
  875.  
  876. tcp_reset()
  877. {
  878. if (logon) {
  879.     kblock = kblcode = 0;
  880.     online = 1;
  881.     }
  882. lastwcc = 0x02;
  883. kb_err = 0;
  884. kbqsize = 0;
  885. aplmode = insmode = 0;
  886. fixbracket = cs.std_brack && (!aplmode) && (stdfont != ALAFONT);
  887. newstat();
  888. }
  889.  
  890. ATuld()            /* if necessary, unload .ATP driver */
  891. {
  892. CntrlParam cp;
  893.  
  894. if (sw_active() || (!unldATP)) return;
  895.  
  896. unldATP = 0;
  897. cp.ioCRefNum = -11;        /* .ATP reference number */
  898. PBClose(&cp, 0);
  899. }
  900.  
  901. OSErr NBld()            /* load NBP */
  902. {
  903. CntrlParam cp;
  904. OSErr rc;
  905.  
  906. if (unldNBP) return(0);
  907. cp.ioCRefNum = -10;            /* .MPP driver number */
  908. cp.csCode = 249;
  909. rc = PBControl(&cp, 0);
  910. if (rc == 0) unldNBP = 1;
  911. return(rc);
  912. }
  913.  
  914. NBuld()                    /* unload NBP */
  915. {
  916. CntrlParam cp;
  917.  
  918. if (!unldNBP) return;
  919. cp.ioCRefNum = -10;            /* .MPP driver number */
  920. cp.csCode = 255;
  921. PBControl(&cp, 0);
  922. unldNBP = 0;
  923. }
  924.  
  925. OSErr nblookup(object, type, zone, result, count)
  926. char * object, * type, * zone;
  927. NTElement * result;
  928. short * count;
  929. {
  930. MPPParamBlock Mpb;
  931. OSErr rc;
  932. char entity[99];
  933.  
  934. NBPSetEntity(entity, object, type, zone);
  935. Mpb.NBPinterval = 3;
  936. Mpb.NBPcount = 4;
  937. Mpb.NBPentityPtr = entity;
  938. Mpb.NBPretBuffPtr = (Ptr)result;
  939. Mpb.NBPretBuffSize = sizeof(NTElement);
  940. Mpb.NBPmaxToGet = 1;
  941. Mpb.MPPioRefNum = -10;            /* .MPP driver number */
  942. Mpb.MPPcsCode = 251;            /* lookup name */
  943. rc = PBControl(&Mpb, 0);
  944. (*count) = Mpb.NBPnumGotten;
  945. return(rc);
  946. }
  947.  
  948. OSErr atsend(ablock, sendaddr, sendlen, retbds)
  949. AddrBlock * ablock;
  950. char * sendaddr;
  951. short sendlen;
  952. BDSPtr retbds;
  953. {
  954. ATPParamBlock Apb;
  955. OSErr rc;
  956.  
  957. Apb.ATPuserData = 0;
  958. Apb.ATPcsCode = 255;
  959. Apb.ATPioRefNum = -11;
  960. Apb.ATPatpFlags = 0;
  961. Apb.ATPaddrBlock = (*ablock);
  962. Apb.ATPreqLength = sendlen;
  963. Apb.ATPreqPointer = sendaddr; 
  964. Apb.ATPbdsPointer = (Ptr)retbds;
  965. Apb.ATPnumOfBuffs = 1;
  966. Apb.ATPtimeOutVal = cs.timeout;
  967. Apb.ATPretryCount = cs.retries;
  968. rc = PBControl(&Apb, 0);
  969. return(rc);
  970. }
  971.  
  972. OSErr kpdynamip(ipnum)
  973. long * ipnum;
  974. {
  975. IPGP gateRec, gateSend;
  976. BDSType retBDS;
  977. OSErr rc;
  978.  
  979. putln("obtaining dynamic IP number");
  980.  
  981. retBDS[0].buffSize = sizeof(gateRec);
  982. retBDS[0].buffPtr = (Ptr)&gateRec;
  983. gateSend.opcode = 1;
  984. rc = atsend(KIPserver, &gateSend, sizeof(struct IPGP), retBDS);
  985. if (rc != 0) return(rc);
  986. (*ipnum) = gateRec.ipaddress;
  987. return(0);
  988. }
  989.  
  990. OSErr kpregister(ipnum)
  991. unsigned char * ipnum;
  992. {
  993. MPPParamBlock Mpb;
  994. OSErr rc;
  995. char temps[20];
  996.  
  997. sprintf(temps, "%d.%d.%d.%d", ipnum[0], ipnum[1], ipnum[2], ipnum[3]);
  998. sprintf(tcpmsg, "registering %s", temps);
  999. putln(tcpmsg);
  1000. ctop(temps);
  1001. if (KIPnameptr) kpunregister();
  1002. KIPnameptr = &myreg;
  1003. setmem(&myreg, sizeof(NamesTableEntry), 0);
  1004. NBPSetNTE(&myreg, temps, "\pIPADDRESS", KIPzone, 72);
  1005. Mpb.MPPioRefNum = -10;
  1006. Mpb.MPPcsCode = 253;
  1007. Mpb.NBPinterval = 5;
  1008. Mpb.NBPcount = 5;
  1009. Mpb.NBPntQElPtr = (Ptr)&myreg; 
  1010. Mpb.NBPverifyFlag = 1; 
  1011. rc = PBControl(&Mpb, 0);
  1012. sprintf(tcpmsg, "rc = %d from NBPRegister", rc);
  1013. putln(tcpmsg);
  1014. return(rc);
  1015. }
  1016.  
  1017. kpunregister()
  1018. {
  1019. MPPParamBlock Mpb;
  1020. OSErr rc;
  1021.  
  1022. Mpb.MPPioRefNum = -10;
  1023. Mpb.MPPcsCode = 252;
  1024. Mpb.NBPentityPtr = (Ptr)myreg.nt.entityData; 
  1025. rc = PBControl(&Mpb, 0);
  1026. KIPnameptr = 0;
  1027. sprintf(tcpmsg, "rc = %d from NBPRemove", rc);
  1028. putln(tcpmsg);
  1029. }
  1030.  
  1031. putln (s)                /*  put message in error log */
  1032. char * s;
  1033. {
  1034. static FILE *fp = 0;
  1035. static char debugfile[] = "Ram:tcpdebug";
  1036. short fref, i;
  1037. long count;
  1038. static int rc;
  1039.  
  1040. if (!cs.dblevel) return;
  1041.  
  1042. if (cs.dblevel == 99) {
  1043.     if (!tcpopnflg) {
  1044.         rc = seropen();
  1045.         tcpopnflg = 1;
  1046.         }
  1047.     if (rc != 0) return;
  1048.  
  1049.     count = strlen(s);
  1050.     if (count > 0)
  1051.         for (i = 0; i < count; i++) {
  1052.             rc = serchr(s[i]);
  1053.             myStask();
  1054.             if (rc != 0) break;
  1055.             }
  1056.     if (rc == 0) rc = serchr('\015');
  1057.     if (rc == 0) rc = serchr('\012');
  1058.     dbgwait();
  1059.     }
  1060. else {
  1061.     if (!tcpopnflg) {
  1062.         FSDelete(debugfile, 0);
  1063.         Create(debugfile, 0, 'MPS ', 'TEXT');
  1064.         tcpopnflg = 1;
  1065.         }
  1066.     if (FSOpen(debugfile, 0, &fref) != 0) return;
  1067.     SetFPos(fref, fsFromLEOF, 0L);
  1068.     count = strlen(s);
  1069.     if (count > 0) FSWrite(fref, &count, s);
  1070.     count = 1;
  1071.     FSWrite(fref, &count, "\015");
  1072.     FSClose(fref);
  1073.     FlushVol("Ram", 0);
  1074.     }
  1075. }
  1076.  
  1077. seropen()
  1078. {
  1079. int i;
  1080. char * x;
  1081. static char aoutname[8];
  1082.  
  1083. RAMSDOpen(sPortA);
  1084.  
  1085. x = (char *)&pbo;
  1086. for (i=0; i < sizeof(pbo); i++) {
  1087.     x[i] = 0;
  1088.     }
  1089. strcpy(aoutname, ".AOut");
  1090. ctop(aoutname);
  1091. pbo.ioNamePtr = (StringPtr)aoutname;
  1092. pbo.ioRefNum = -7;
  1093. pbo.ioVersNum = 0;
  1094. pbo.ioPermssn = fsWrPerm;
  1095. pbo.ioMisc = 0;
  1096. pbo.ioBuffer = (Ptr)&pbchr;
  1097. pbo.ioReqCount = 1;
  1098. pbo.ioPosMode = 0;
  1099. pbo.ioPosOffset = 0;
  1100.  
  1101. return(0);
  1102. }
  1103.  
  1104. serchr(c)
  1105. unsigned char c;
  1106. {
  1107. pbchr = c;
  1108. return(PBWrite(&pbo, 0));
  1109. }
  1110.  
  1111. OSErr openatdrv()        /* open AppleTalk drivers */
  1112. {
  1113. static unsigned char *SPConfig = (unsigned char *)0x1fb;
  1114. static unsigned char *PortBUse = (unsigned char *)0x291;
  1115. IOParam openblk;
  1116. OSErr rc;
  1117.  
  1118. if ((*PortBUse & 0x80) == 0x80)     {    /* check if port B is in use    */
  1119.                                     /* port B not in use:            */
  1120.     if ((*SPConfig & 0x0f) > 1) {    /* error unless unconfigured    */
  1121.         stoperr(portalrt);            /* or configured for AppleTalk    */
  1122.         return(-98);                
  1123.         }
  1124.     else {                            /* else open MPP driver            */
  1125.         openblk.ioPermssn = 0;
  1126.         openblk.ioNamePtr = (StringPtr)"\p.MPP";
  1127.         rc = PBOpen(&openblk, 0);
  1128.         if (rc != 0) {
  1129.             stoperr(loadalrt);
  1130.             return(rc);
  1131.             }
  1132.         }
  1133.     }
  1134. else {                                /* port B in use:            */
  1135.     if ((*PortBUse & 0x0f) != 1) {    /* error if not in use by     */
  1136.         stoperr(portalrt);            /* AppleTalk                */
  1137.         return(-97);
  1138.         }
  1139.     }
  1140.  
  1141.                                 /* load ATP if not already loaded */
  1142. if ((*PortBUse & 0x10) == 0) {
  1143.     openblk.ioPermssn = 0;
  1144.     openblk.ioNamePtr = (StringPtr)"\p.ATP";
  1145.     rc = PBOpen(&openblk, 0);
  1146.     if (rc != 0) {
  1147.         stoperr(loadalrt);
  1148.         return(rc);
  1149.         }
  1150.     unldATP = 1;                /* remember we loaded .ATP */
  1151.     }
  1152.  
  1153. return(0);
  1154. }
  1155.  
  1156. isHFS()
  1157. {
  1158. return(HFS);
  1159. }
  1160.  
  1161. cvtmask(mask, s)
  1162. long mask;
  1163. char * s;
  1164. {
  1165. register short i, len;
  1166.  
  1167. sprintf(s, "%08lx", mask);
  1168. len = strlen(s);
  1169. for (i=0; i < len; i++)
  1170.     s[i] = toupper(s[i]);
  1171. }
  1172.  
  1173. decodeIPnum( s, myipnum)
  1174. char *s;
  1175. unsigned char *myipnum;
  1176. {
  1177.     short i;
  1178.     int node, hi, low;
  1179.     char temp[50];
  1180.     char addrflag;
  1181.  
  1182.     for (i=0; i<4; i++) myipnum[i]=0;
  1183.     i=0;
  1184.     addrflag = 0;
  1185.  
  1186.     while((*s) && (i<4) ) {
  1187.         switch( *s) {
  1188.             case '0':
  1189.             case '1':
  1190.             case '2':
  1191.             case '3':
  1192.             case '4':
  1193.             case '5':
  1194.             case '6':
  1195.             case '7':
  1196.             case '8':
  1197.             case '9':
  1198.                 myipnum[i]= myipnum[i] *10 + (*s-'0');
  1199.                 break;
  1200.             case '.':
  1201.                 i++;
  1202.                 break;
  1203.             case 'H':
  1204.             case 'h':
  1205.                 if (addrflag == 0) {
  1206.                     getATaddress( &hi, &low, &node);
  1207.                     addrflag = 1;
  1208.                     }
  1209.                 myipnum[i]=hi;
  1210.                 break;
  1211.             case 'L':
  1212.             case 'l':
  1213.                 if (addrflag == 0) {
  1214.                     getATaddress( &hi, &low, &node);
  1215.                     addrflag = 1;
  1216.                     }
  1217.                 myipnum[i]=low;
  1218.                 break;
  1219.             case 'N':
  1220.             case 'n':
  1221.                 if (addrflag == 0) {
  1222.                     getATaddress( &hi, &low, &node);
  1223.                     addrflag = 1;
  1224.                     }
  1225.                 myipnum[i]=node;
  1226.                 break;
  1227.             default:
  1228.                 break;
  1229.             }
  1230.         s++;
  1231.         }
  1232.     
  1233.     sprintf( temp," IPNUM= %d.%d.%d.%d", (int) myipnum[0], (int) myipnum[1], (int) myipnum[2],
  1234.                                          (int) myipnum[3]);
  1235.     putln(temp);
  1236.     
  1237.     if (i<3) return( 1);
  1238.         else return( 0);
  1239. }
  1240.  
  1241. ShowAllErrors()
  1242. {
  1243. int ev, what, dat;
  1244.  
  1245. ev = Sgetevent( ERRCLASS,&what,&dat);
  1246. while (ev) {
  1247.     NetError(dat);
  1248.     ev = Sgetevent( ERRCLASS,&what,&dat);
  1249.     }
  1250. }
  1251.  
  1252. NetError(code)
  1253. int code;
  1254. {
  1255. char buffer1[100],buffer2[100], *neterrstring();
  1256. int  ev, what;
  1257. short class,dItem;
  1258. pascal unsigned short DlgFilter();
  1259. unsigned short (*filterProc) ();
  1260. static char nullstr[1] = {0};
  1261.  
  1262. buffer1[0]=0;
  1263. buffer2[0]=0;
  1264.  
  1265. if (code<0) {
  1266.     strncpy( buffer2, neterrstring(code), 99);
  1267.     ev = Sgetevent( ERRCLASS,&what,&code);
  1268.     if (ev)
  1269.         strncpy( buffer1, neterrstring(code), 99);
  1270.     }
  1271. else
  1272.     strncpy( buffer1, neterrstring(code), 99);
  1273.  
  1274. class = code/100;
  1275. if ((code == 402) || (code == 405)) class = 5;
  1276. if ((class==1 || class==5 || class==9)  && (code!=503)  ) {
  1277.     /* Ok, I'll show the user these */
  1278.     ParamText( buffer1, buffer2, nullstr, nullstr);
  1279.     filterProc = DlgFilter;
  1280.     arrowcursor();
  1281.     if (class == 9) StopAlert(274, filterProc);
  1282.     else if (class == 5) CautionAlert(275, filterProc);
  1283.     else NoteAlert(276, filterProc);
  1284.     ParamText(nullstr, nullstr, nullstr, nullstr);
  1285.     }
  1286. if (buffer1[0])
  1287.     putln(buffer1);
  1288. if (buffer2[0])
  1289.     putln(buffer2);
  1290. }
  1291.  
  1292. tcpinfo()
  1293. {
  1294. DialogPtr dlgptr;
  1295. DialogPeek dStorage;
  1296. WindowPtr behind;
  1297. short gtype, itemHit;
  1298. Rect gbox;
  1299. pascal unsigned short DlgFilter();
  1300. unsigned short (*filterProc) ();
  1301. Handle hosth, iph, stath;
  1302. char ipstr[20];
  1303.  
  1304. dStorage = 0;
  1305. behind = (WindowPtr)-1;
  1306. dlgptr = GetNewDialog(277, dStorage, behind);
  1307. ctrwindow(dlgptr);
  1308.  
  1309. /* get handles we will need */
  1310. GetDItem(dlgptr, 3, >ype, &hosth, &gbox);
  1311. GetDItem(dlgptr, 5, >ype, &iph, &gbox);
  1312. GetDItem(dlgptr, 7, >ype, &stath, &gbox);
  1313.  
  1314. /* set host name */
  1315. if (pend_conn == 1) SetIText(hosth, sessionhost);
  1316. else if (mp->hname == 0) {
  1317.         if (mp->sname == 0) SetIText(hosth, "unknown");
  1318.         else if (strcmp(mp->sname, "default") == 0) SetIText(hosth, "unknown");
  1319.              else SetIText(hosth, mp->sname);
  1320.         }
  1321.      else SetIText(hosth, mp->hname);
  1322.  
  1323. /* set ip number */
  1324. if (pend_conn == 1) SetIText(iph, "unknown");
  1325. else {
  1326.     sprintf(ipstr, "%d.%d.%d.%d", mp->hostip[0],
  1327.     mp->hostip[1], mp->hostip[2], mp->hostip[3]);
  1328.     SetIText(iph, ipstr);
  1329.     }
  1330.  
  1331. /* set status */
  1332. switch (pend_conn) {
  1333.     case 0:                        /* if 0, must be logged on */
  1334.         SetIText(stath, "3270 session established");
  1335.         break;
  1336.     case 1:                        /* waiting for name server */
  1337.         SetIText(stath, "waiting for response from name server");
  1338.         break;
  1339.     case 2:                        /* waiting for connection */
  1340.         SetIText(stath, "waiting for connection to complete");
  1341.         break;
  1342.     case 3:                        /* negotiating settings */
  1343.         if (hadascii) SetIText(stath, "connected in line mode");
  1344.         else SetIText(stath, "connected: negotiating settings");
  1345.         break;
  1346.     default:                    /* shouldn't happen */
  1347.         break;
  1348.     }
  1349.  
  1350. /* ready to display the dialog */
  1351. ShowWindow(dlgptr);
  1352. arrowcursor();
  1353. /* frame the default selection */
  1354. framedflt(dlgptr);
  1355.  
  1356. /* display the dialog until OK selected */
  1357. filterProc = DlgFilter;
  1358. itemHit = 0;
  1359. while (itemHit != 1) ModalDialog(filterProc, &itemHit);
  1360.  
  1361. DisposDialog(dlgptr);
  1362. }
  1363.  
  1364. int tcp_session()        /* return TRUE if session active */
  1365. {
  1366. return(logon || (hadascii && (pend_conn == 3)));
  1367. }
  1368.  
  1369. short rdportnum()        /* return port number from tcphostname, or default */
  1370. {
  1371. register short i, count, len, port;
  1372. register char * s;
  1373.  
  1374. len = strlen(tcphostname);
  1375. if (len < 3) return(HTELNET);     /* need at least two colons and digit */
  1376.  
  1377. count = 0;
  1378. for (i=0; i < len; i++) {
  1379.     if (tcphostname[i] == ':') count++;
  1380.     if (count == 2) break;
  1381.     }
  1382. if (count < 2) return(HTELNET);
  1383. s = tcphostname + i + 1;            /* s = host number string */
  1384. if (s[0] == '\0') return(HTELNET);
  1385. if ((strcmp(s, "IRC") == 0) || (strcmp(s, "irc") == 0)) {
  1386.     serverconn = 1;
  1387.     servermode = 0;
  1388.     serverflags = 1;
  1389.     port = 6667;
  1390.     }
  1391. else if ((strcmp(s, "SMTP") == 0) || (strcmp(s, "smtp") == 0)) {
  1392.     serverconn = 1;
  1393.     servermode = 0;
  1394.     serverflags = 0;
  1395.     port = 25;
  1396.     }
  1397. else if ((strncmp(s, "SERVER=", 7) == 0) || (strncmp(s, "server=", 7) == 0)) {
  1398.     serverconn = 1;
  1399.     servermode = 0;
  1400.     serverflags = 0;
  1401.     port = atoi(s+7);
  1402.     }
  1403. else {
  1404.     serverconn = servermode = serverflags = 0;
  1405.     port = atoi(s);
  1406.     }
  1407. if (port == 0) {
  1408.     sprintf(tcpmsg, "Port specification %s is invalid", s);
  1409.     putln(tcpmsg);
  1410.     stoperr(pnumalrt);
  1411.     port = HTELNET;
  1412.     }
  1413. if (serverconn) {
  1414.     sprintf(tcpmsg, "Using non-Telnet connection mode");
  1415.     putln(tcpmsg);
  1416.     }
  1417. sprintf(tcpmsg, "port number = %d", port);
  1418. putln(tcpmsg);
  1419. return(port);
  1420. }
  1421.  
  1422. printf(s)
  1423. char * s;
  1424. {
  1425. putln(s);
  1426. }
  1427.  
  1428. tcpdump(msg, data, len)
  1429. unsigned char *msg, *data;
  1430. short len;
  1431. {
  1432. short count, i, j;
  1433. unsigned char tcpchar[66];
  1434.  
  1435.  
  1436. sprintf(tcpmsg, "%s: %d bytes:", msg, len); 
  1437. putln(tcpmsg);
  1438.  
  1439. count = 0;
  1440. tcpmsg[0] = 0;
  1441. tcpchar[0] = 0;
  1442. for (i=0; i < len; i++) {
  1443.     j = strlen(tcpmsg);
  1444.     sprintf(tcpmsg+j, "%02x", data[i]);
  1445.     if (xtabh != 0) {
  1446.         j = strlen(tcpchar);
  1447.         if (nl_handle != 0) {
  1448.             sprintf(tcpchar+j, "%c ", (*xtabh)[nltab[data[i]]]);
  1449.             }
  1450.         else {
  1451.             sprintf(tcpchar+j, "%c ", (*xtabh)[data[i]]);
  1452.             }
  1453.         }
  1454.     count++;
  1455.     if (count == 32) {
  1456.         putln(tcpmsg);
  1457.         if (xtabh != 0) putln(tcpchar);
  1458.         tcpmsg[0] = 0;
  1459.         tcpchar[0] = 0;
  1460.         count = 0;
  1461.         }
  1462.     }
  1463. if (strlen(tcpmsg) > 0) putln(tcpmsg);
  1464. if ((strlen(tcpchar) > 0) && (xtabh != 0)) putln(tcpchar);
  1465. putln("");
  1466. }
  1467.  
  1468. dbgwait()
  1469. {
  1470. static unsigned long *Ticks = (unsigned long *)0x16a;
  1471. unsigned long limit;
  1472.  
  1473. limit = (*Ticks) + 15;
  1474. while (limit > (*Ticks)) myStask();
  1475. }
  1476.  
  1477. OSErr getstr(s, lim, num)
  1478. char * s;
  1479. short lim, num;
  1480. {
  1481. short rfile, rc;
  1482. Handle temph;
  1483. unsigned char * tempp;
  1484.  
  1485. sysvol(0);
  1486. rfile = OpenResFile(CFIGFILE);
  1487. if (rfile != -1) {
  1488.     temph = GetResource('STR ', num);
  1489.     if (temph != 0) if (HomeResFile(temph) == rfile) {
  1490.         tempp = *temph;
  1491.         if (tempp[0] > lim-1) rc = 12;
  1492.         else {
  1493.             movmem(tempp, s, tempp[0]+1);
  1494.             ptoc(s);
  1495.             sprintf(tcpmsg, "STR %d = \"%s\"", num, s);
  1496.             putln(tcpmsg);
  1497.             rc = 0;
  1498.             }
  1499.         }
  1500.     else rc = 8;
  1501.     CloseResFile(rfile);
  1502.     }
  1503. else rc = 4;
  1504. sysvol(1);
  1505. sprintf(tcpmsg, "getstr rc = %d for STR %d", rc, num);
  1506. putln(tcpmsg);
  1507. return(rc);
  1508. }
  1509.  
  1510. sysvol(reset)
  1511. short reset;
  1512. {
  1513. char strbuff[256];
  1514. static short dfltvol;
  1515.  
  1516. if (reset) SetVol(0L, dfltvol);
  1517. else {
  1518.     GetVol(strbuff, &dfltvol);
  1519.     SetVol(0L, systemvol);
  1520.     }
  1521. }
  1522.  
  1523. tcpquit(rc)
  1524. OSErr rc;
  1525. {
  1526. /* error "rc" from opening MacTCP */
  1527. sprintf(tcpmsg, "Unable to open MacTCP.  Result code = %d.", rc);
  1528. stopterr(tcpmsg);
  1529. quit();
  1530. }
  1531.  
  1532. quit()
  1533. {
  1534. if ((pend_conn > 0) || (logon)) {
  1535.     netclose(myport);
  1536.     pend_conn = 0;
  1537.     logon = 0;
  1538.     }
  1539. if (kipreg) {
  1540.     kpunregister();        /* un-register our address */
  1541.     kipreg = 0;
  1542.     }
  1543. if (tcpinitok) {
  1544.     netshut();            /* undo Snetinit */
  1545.     tcpinitok = 0;
  1546.     }
  1547. NBuld();            /* unload NBP */
  1548. ATuld();            /* unload ATP */
  1549. DisposPtr(wsfbuff);
  1550. DisposPtr(rcvbuff);
  1551. macend();
  1552. ExitToShell();
  1553. }
  1554.  
  1555. DisplayMacBinary()
  1556. {
  1557. }
  1558.  
  1559. checkhostfile()
  1560. {
  1561. OSErr rc, fsrdopen();
  1562. short fnum;
  1563. Point where;
  1564. ProcPtr fileFilter, dlgHook;
  1565. short numTypes;
  1566. SFTypeList typeList;
  1567. SFReply reply;
  1568. char hostfile[12];
  1569.  
  1570. strcpy(hostfile, "config.tel");
  1571. rc = fsrdopen(hostfile, savedvol, &fnum);
  1572. if (rc == 0) {
  1573.     FSClose(fnum);
  1574.     return;
  1575.     }
  1576. /* couldn't find the file on the default volume, so try the launch volume */
  1577. SetVol(0L, launchvol);
  1578. rc = fsrdopen(hostfile, launchvol, &fnum);
  1579. if (rc == 0) {
  1580.     FSClose(fnum);
  1581.     return;
  1582.     }
  1583. /* now try the system volume */
  1584. SetVol(0L, systemvol);
  1585. rc = fsrdopen(hostfile, systemvol, &fnum);
  1586. if (rc == 0) {
  1587.     FSClose(fnum);
  1588.     return;
  1589.     }
  1590. /* finally, allow the user to locate it */
  1591. SetVol(0L, savedvol);
  1592. note_err(hostfalrt);            /* tell users what to do with SFGetFile */
  1593. where = sfgpoint;
  1594. fileFilter = dlgHook = 0;
  1595. numTypes = 1;
  1596. typeList[0] = 'TEXT';
  1597. dlgHook = 0;
  1598. arrowcursor();
  1599. SFGetFile(&where, "Select the file \"config.tel\":", fileFilter,
  1600.             numTypes, typeList, dlgHook, &reply);
  1601. if (reply.good == 0) return;
  1602. SetVol(0L, reply.vRefNum);
  1603. }